"""
文件方法对象

读取文件并不是要按照顺序来读取的，也有一些方法跳到指定位置开始读取文件

参考文档：https://docs.python.org/zh-cn/3/tutorial/inputoutput.html#methods-of-file-objects
"""

def testFileMethods():
    """
    文件方法对象
    """

    with open('', 'r') as file:
        # f.read(size)可用于读取文件内容，它会读取一些数据，并返回字符串（文本模式）或字节串对象（在二进制模式下），
        # size是可选的数值参数，省略size或size为负数时，读取并返回整个文件的内容；
        # 但是文件大小是内存的两倍时，会出现问题。size取其他值时，读取并返回最多size个字符（文本模式）或size个字节（二进制模式）
        # 如已到达文件末尾，f.read() 返回空字符串（''）

        filestream = file.read()
        print("filestream is {}".format(filestream))

        # f.readline()从文件中读取单行数据；字符串末尾保留换行符（\n），
        # 只有在文件不以换行符结尾时，文件的最后一行才会省略换行符。
        # 只要f.readline()返回空字符串，就表示已经到达了文件末尾，
        # 空行使用'\n'表示，该字符串只包含一个换行符
        print("file.readline() is {}".format(file.readline()))

        # 从文件读取多行时，可以用循环遍历整个文件对象，这种操作能够高效利用内存，并且代码简单
        for line in file:
            print(line, end=" ")

        # f.write(string)写入字符串

        # f.tell()返回整数，给出文件对象在文件中的当前位置，
        # 表示为二进制模式下时从文件开始的字节数，以及文本模式下的意义不明的数字

        # f.seek(offset, whence)可以改变文件对象的位置。
        # 通过向参考点添加 offset 计算位置；参考点由whence参数指定。
        # whence值为
        # 0时，表示从文件开头计算，
        # 1表示使用当前文件位置，
        # 2表示使用文件末尾作为参考点。
        # 省略whence时，其默认值为0，即使用文件开头作为参考点

testFileMethods()